﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace pong
{
    class Bola
    {

        Texture2D texture;
        Vector2 position;
        public Vector2 Position
        {
            get
            {
                return position;
            }
            set
            {
                position = value;
            }
        }
        Rectangle size;
        Vector2 vel;
        GameWindow janela;
        Random random = new Random ();
        SoundEffect soundEffect;
        int velocidade = 0;
        int VelX = 3;

        public Bola(GameWindow janela, Texture2D texture, Vector2 position, SoundEffect soundEffect)
        {
            this.texture = texture;
            this.position = position;
            this.janela = janela;
            this.vel = new Vector2 (VelX,3);
            this.size = texture.Bounds;
            Update();
           
            this.soundEffect = soundEffect;
        }

        public void LoadContent()
        {
           
        }

        public void Update()
        {
            if (VelX > 25) //impedir a bola de romper a velocidade do hitTest
            {
                VelX = 25;
            }
            if (velocidade > 5) //incrementar a velocidade da bola a cada 5 rebatidas
            {
                VelX ++ ;
                velocidade = 0;
            }
            position += vel; //movimenta a bola
            

            //atualiza a posicao do retangulo da bola de acordo com  a sua posicao 
            this.size.X = (int)position.X;
            this.size.Y = (int)position.Y;    


            #region Manter na Janela

            if (position.Y <= 0)
            {
                vel.Y *= -1;
                soundEffect.Play();
            }
            if (position.Y >= janela.ClientBounds.Height - texture.Height)
            {
                vel.Y *= -1;
                soundEffect.Play();
            }

            if (position.X <= 0)
            {
                vel.X *= -1;
                soundEffect.Play();
            }

            if (position.X >= janela.ClientBounds.Width - texture.Width)
            {
                vel.X = VelX;
                soundEffect.Play();
            }
            #endregion
        }

        public void Colision(Rectangle jogador1, Rectangle jogador2)
        {
            if (this.size.Intersects(jogador1) )
            {
                velocidade++; //incrementa o contador que aumentará a velocidade.
                //Muda a direção
                 int lugarColisao = (int) ((( (position.Y - jogador1.Y)/(jogador1.Height/2) )-1)*(3));
                //causa uma variação na direção que a bola rebate
                //quanto mais nas pontas maior o angulo da rebatida.
                 switch (lugarColisao)
                 {
                     case 0:
                         vel.Y = 0;

                         break;

                     case 1:
                         vel.Y = 1;
                         break;

                     case 2:
                         vel.Y = 2;
                         break;

                     case 3:
                         vel.Y = 3;
                         break;

                     case -1:
                         vel.Y = -1;
                         break;

                     case -2:
                         vel.Y = -2;
                         break;

                     case -3:
                         vel.Y = -3;
                         break;
                 }
                VelX *= - 1;
                
                this.soundEffect.Play();
            }
            if (this.size.Intersects(jogador2))
            {
                velocidade++; //incrementa o contador que aumentará a velocidade.
                //Muda a direção
                int lugarColisao = (int)((((position.Y - jogador2.Y) / (jogador2.Height / 2)) - 1) * (3));
                //causa uma variação na direção que a bola rebate
                //quanto mais nas pontas maior o angulo da rebatida
                switch (lugarColisao)
                {
                    case 0:
                        vel.Y = 0;

                        break;

                    case 1:
                        vel.Y = 1;
                        break;

                    case 2:
                        vel.Y = 2;
                        break;

                    case 3:
                        vel.Y = 3;
                        break;

                    case -1:
                        vel.Y = -1;
                        break;

                    case -2:
                        vel.Y = -2;
                        break;

                    case -3:
                        vel.Y = -3;
                        break;
                }
                VelX *= -1;
               
                this.soundEffect.Play();
            }
            vel.X = VelX; //atualiza a velocidade X da bola
        }

        public void gol1() //reseta os parametros no caso de gol do jogador 1
        {
            velocidade = 0;
            VelX = 3;
        }

        public void gol2() //reseta os parametros no caso de gol do jogador 2
        {
            velocidade = 0;
            VelX = -3;
        }

        public void Draw(SpriteBatch spriteBatch)
        {
           spriteBatch.Draw(texture, position, Color.White);
        }

    }
}
